package svc

import (
	"github.com/satori/go.uuid"
	"gorm.io/gorm"
	"time"
)

// User 原来 SysUser
type User struct {
	ID          int       `gorm:"primarykey"`
	UUID        uuid.UUID `json:"uuid" gorm:"comment:用户UUID"`
	Username    string    `json:"userName" gorm:"comment:用户登录名"`
	Password    string    `json:"-" gorm:"comment:用户登录密码"`
	NickName    string    `json:"nickName" gorm:"default:系统用户;comment:用户昵称"`
	SideMode    string    `json:"sideMode" gorm:"default:dark;comment:用户侧边主题"`
	HeaderImg   string    `json:"headerImg" gorm:"default:http://qmplusimg.henrongyi.top/head.png;comment:用户头像"`
	BaseColor   string    `json:"baseColor" gorm:"default:#fff;comment:基础颜色"`
	ActiveColor string    `json:"activeColor" gorm:"default:#1890ff;comment:活跃颜色"`
	AuthorityId string    `json:"authorityId" gorm:"default:888;comment:用户角色ID"`
	Phone       string    `json:"phone"  gorm:"comment:用户手机号"` // 用户角色ID
	Email       string    `json:"email"  gorm:"comment:用户邮箱"`  // 用户邮箱
	CreatedAt   time.Time
	UpdatedAt   time.Time
	DeletedAt   gorm.DeletedAt `gorm:"index" json:"-"`
}

// UserAuthority 原 SysUserAuthority
type UserAuthority struct {
	UserId      int    `gorm:"column:user_id;comment:user表的Id"`
	AuthorityId string `gorm:"column:authority_id;comment:authority表的主键Id"`
}

// OperationRecord 原来的SysOperationRecord
type OperationRecord struct {
	ID           int            `gorm:"primarykey"`                                                                   // 主键ID
	Ip           string         `json:"ip" form:"ip" gorm:"column:ip;comment:请求ip"`                                   // 请求ip
	Method       string         `json:"method" form:"method" gorm:"column:method;comment:请求方法"`                       // 请求方法
	Path         string         `json:"path" form:"path" gorm:"column:path;comment:请求路径"`                             // 请求路径
	Status       int            `json:"status" form:"status" gorm:"column:status;comment:请求状态"`                       // 请求状态
	Latency      time.Duration  `json:"latency" form:"latency" gorm:"column:latency;comment:延迟" swaggertype:"string"` // 延迟
	Agent        string         `json:"agent" form:"agent" gorm:"column:agent;comment:代理"`                            // 代理
	ErrorMessage string         `json:"error_message" form:"error_message" gorm:"column:error_message;comment:错误信息"`  // 错误信息
	Body         string         `json:"body" form:"body" gorm:"type:text;column:body;comment:请求Body"`                 // 请求Body
	Resp         string         `json:"resp" form:"resp" gorm:"type:text;column:resp;comment:响应Body"`                 // 响应Body
	UserID       int            `json:"user_id" form:"user_id" gorm:"column:user_id;comment:用户id"`                    // 用户id
	CreatedAt    time.Time      // 创建时间
	UpdatedAt    time.Time      // 更新时间
	DeletedAt    gorm.DeletedAt `gorm:"index" json:"-"` // 删除时间
}

// DictionaryDetail 原 SysDictionaryDetail
type DictionaryDetail struct {
	ID           int            `gorm:"primarykey"`
	Label        string         `json:"label" form:"label" gorm:"column:label;comment:展示值"`                                          // 展示值
	Value        int            `json:"value" form:"value" gorm:"column:value;comment:字典值"`                                          // 字典值
	Status       bool           `json:"status" form:"status" gorm:"column:status;comment:启用状态"`                                      // 启用状态
	Sort         int            `json:"sort" form:"sort" gorm:"column:sort;comment:排序标记"`                                            // 排序标记
	DictionaryID int            `json:"sysDictionaryID" form:"sysDictionaryID" gorm:"column:dictionary_id;comment:关联dictionary表的主键"` // 关联标记
	CreatedAt    time.Time      // 创建时间
	UpdatedAt    time.Time      // 更新时间
	DeletedAt    gorm.DeletedAt `gorm:"index" json:"-"` // 删除时间
}

// Dictionary 原 SysDictionary
type Dictionary struct {
	ID        int            `gorm:"primarykey"`
	Name      string         `json:"name" form:"name" gorm:"column:name;comment:字典名（中）"`   // 字典名（中）
	Type      string         `json:"type" form:"type" gorm:"column:type;comment:字典名（英）"`   // 字典名（英）
	Status    bool           `json:"status" form:"status" gorm:"column:status;comment:状态"` // 状态
	Desc      string         `json:"desc" form:"desc" gorm:"column:desc;comment:描述"`       // 描述
	CreatedAt time.Time      // 创建时间
	UpdatedAt time.Time      // 更新时间
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` // 删除时间
}

// DataAuthorityId 原 SysDataAuthorityId 这张表应该是自动生成的
type DataAuthorityId struct {
	AuthorityId                string `json:"authorityId" gorm:"comment:authority表的主键"`
	DataAuthorityIdAuthorityId string `json:"dataAuthorityIdAuthorityId"`
}

// BaseMenu 原 SysBaseMenu
type BaseMenu struct {
	ID          int            `gorm:"primarykey"`
	MenuLevel   uint           `json:"-"`
	ParentId    string         `json:"parentId" gorm:"comment:父菜单ID"`           // 父菜单ID
	Path        string         `json:"path" gorm:"comment:路由path"`              // 路由path
	Name        string         `json:"name" gorm:"comment:路由name"`              // 路由name
	Hidden      bool           `json:"hidden" gorm:"comment:是否在列表隐藏"`           // 是否在列表隐藏
	Component   string         `json:"component" gorm:"comment:对应前端文件路径"`       // 对应前端文件路径
	Sort        int            `json:"sort" gorm:"comment:排序标记"`                // 排序标记
	KeepAlive   bool           `json:"keepAlive" gorm:"comment:是否缓存"`           // 是否缓存
	DefaultMenu bool           `json:"defaultMenu" gorm:"comment:是否是基础路由（开发中）"` // 是否是基础路由（开发中）
	Title       string         `json:"title" gorm:"comment:菜单名"`                // 菜单名
	Icon        string         `json:"icon" gorm:"comment:菜单图标"`                // 菜单图标
	CloseTab    bool           `json:"closeTab" gorm:"comment:自动关闭tab"`         // 自动关闭tab
	CreatedAt   time.Time      // 创建时间
	UpdatedAt   time.Time      // 更新时间
	DeletedAt   gorm.DeletedAt `gorm:"index" json:"-"` // 删除时间
}

// BaseMenuParameter 原 SysBaseMenuParameter
type BaseMenuParameter struct {
	ID         int            `gorm:"primarykey"`
	BaseMenuID int            `json:"baseMenuId" gorm:"comment:关联base_menu表的主键"`
	Type       string         `json:"type" gorm:"comment:地址栏携带参数为params还是query"` // 地址栏携带参数为params还是query
	Key        string         `json:"key" gorm:"comment:地址栏携带参数的key"`            // 地址栏携带参数的key
	Value      string         `json:"value" gorm:"comment:地址栏携带参数的值"`            // 地址栏携带参数的值
	CreatedAt  time.Time      // 创建时间
	UpdatedAt  time.Time      // 更新时间
	DeletedAt  gorm.DeletedAt `gorm:"index" json:"-"` // 删除时间
}

// BaseMenuBtn 原 SysBaseMenuBtn
type BaseMenuBtn struct {
	ID         int            `gorm:"primarykey"`
	Name       string         `json:"name" gorm:"comment:按钮关键key"`
	Desc       string         `json:"desc" gorm:"按钮备注"`
	BaseMenuID uint           `json:"sysBaseMenuID" gorm:"comment:菜单ID(关联base_menu表的主键Id)"`
	CreatedAt  time.Time      // 创建时间
	UpdatedAt  time.Time      // 更新时间
	DeletedAt  gorm.DeletedAt `gorm:"index" json:"-"` // 删除时间
}

// AutoCodeStruct 初始版本自动化代码工具
type AutoCodeStruct struct {
	StructName         string   `json:"structName"`         // Struct名称
	TableName          string   `json:"tableName"`          // 表名
	PackageName        string   `json:"packageName"`        // 文件名称
	HumpPackageName    string   `json:"humpPackageName"`    // go文件名称
	Abbreviation       string   `json:"abbreviation"`       // Struct简称
	Description        string   `json:"description"`        // Struct中文名称
	AutoCreateApiToSql bool     `json:"autoCreateApiToSql"` // 是否自动创建api
	AutoMoveFile       bool     `json:"autoMoveFile"`       // 是否自动移动文件
	Fields             []*Field `json:"fields"`
	DictTypes          []string `json:"-"`
}

// AutoCodeHistory 原 SysAutoCodeHistory 自动迁移代码记录,用于回滚,重放使用
type AutoCodeHistory struct {
	ID            int            `gorm:"primarykey"`
	TableName     string         `json:"tableName"`
	RequestMeta   string         `gorm:"type:text" json:"requestMeta,omitempty"`   // 前端传入的结构化信息
	AutoCodePath  string         `gorm:"type:text" json:"autoCodePath,omitempty"`  // 其他meta信息 path;path
	InjectionMeta string         `gorm:"type:text" json:"injectionMeta,omitempty"` // 注入的内容 RouterPath@functionName@RouterString;
	StructName    string         `json:"structName"`
	StructCNName  string         `json:"structCNName"`
	ApiIDs        string         `json:"apiIDs,omitempty"` // api表注册内容
	Flag          int            `json:"flag"`             // 表示对应状态 0 代表创建, 1 代表回滚 ...
	CreatedAt     time.Time      // 创建时间
	UpdatedAt     time.Time      // 更新时间
	DeletedAt     gorm.DeletedAt `gorm:"index" json:"-"` // 删除时间
}

// AuthorityMenus 原来 SysAuthorityMenu
type AuthorityMenus struct {
	BaseMenuId  int    `json:"baseMenuId" gorm:"comment:base_menu表的主键"`
	AuthorityId string `json:"authorityId" gorm:"comment:authority表的主键"`
}

// AuthorityMenu 原 AuthorityMenu (原来这是一张视图)
type AuthorityMenu struct {
	ID          int    `gorm:"primarykey"`
	Path        string `json:"path" gorm:"comment:路由path"`    // 路由path
	Icon        string `json:"icon" gorm:"comment:菜单图标"`      // 菜单图标
	Name        string `json:"name" gorm:"comment:路由name"`    // 路由name
	Sort        int    `json:"sort" gorm:"comment:排序标记"`      // 排序标记
	Title       string `json:"title" gorm:"comment:菜单名"`      // 菜单名
	Hidden      bool   `json:"hidden" gorm:"comment:是否在列表隐藏"` // 是否在列表隐藏
	Component   string `json:"component" gorm:"comment:对应前端文件路径"`
	ParentId    string `json:"parentId" gorm:"comment:父菜单ID"` // 父菜单ID
	KeepAlive   bool   `json:"keepAlive" gorm:"comment:是否缓存"` // 是否缓存
	MenuLevel   int    `json:"-"`
	DefaultMenu bool   `json:"defaultMenu" gorm:"comment:是否是基础路由（开发中）"` // 是否是基础路由（开发中）
	CloseTab    bool   `json:"closeTab" gorm:"comment:自动关闭tab"`         // 自动关闭tab
	MenuId      string `json:"menuId" gorm:"comment:菜单ID"`
	AuthorityId string `json:"-" gorm:"comment:角色ID"`
}

// AuthorityBtn  原 SysAuthorityBtn
type AuthorityBtn struct {
	AuthorityId   string `gorm:"comment:角色ID"`
	MenuID        int    `gorm:"comment:菜单ID"`
	BaseMenuBtnID int    `gorm:"comment:菜单按钮ID"`
}

// Authority 原 SysAuthority
type Authority struct {
	ID            string     `json:"authorityId" gorm:"not null;unique;primary_key;comment:角色ID;size:90"` // 角色ID
	AuthorityName string     `json:"authorityName" gorm:"comment:角色名"`                                    // 角色名
	ParentId      string     `json:"parentId" gorm:"comment:父角色ID"`                                       // 父角色ID
	DefaultRouter string     `json:"defaultRouter" gorm:"comment:默认菜单;default:dashboard"`                 // 默认菜单(默认dashboard)
	CreatedAt     time.Time  // 创建时间
	UpdatedAt     time.Time  // 更新时间
	DeletedAt     *time.Time `sql:"index"`
}

// Api 原 SysApi
type Api struct {
	ID          int        `gorm:"primarykey"`
	Path        string     `json:"path" gorm:"comment:api路径"`             // api路径
	Description string     `json:"description" gorm:"comment:api中文描述"`    // api中文描述
	ApiGroup    string     `json:"apiGroup" gorm:"comment:api组"`          // api组
	Method      string     `json:"method" gorm:"default:POST;comment:方法"` // 方法:创建POST(默认)|查看GET|更新PUT|删除DELETE
	CreatedAt   time.Time  // 创建时间
	UpdatedAt   time.Time  // 更新时间
	DeletedAt   *time.Time `sql:"index"`
}

// JwtBlacklist 原 JwtBlacklist
type JwtBlacklist struct {
	ID        int        `gorm:"primarykey"`
	Jwt       string     `gorm:"type:text;comment:jwt"`
	CreatedAt time.Time  // 创建时间
	UpdatedAt time.Time  // 更新时间
	DeletedAt *time.Time `sql:"index"`
}

// ExaFile file struct, 文件结构体
type ExaFile struct {
	ID         int `gorm:"primarykey"`
	FileName   string
	FileMd5    string
	FilePath   string
	ChunkTotal int
	IsFinish   bool
	CreatedAt  time.Time  // 创建时间
	UpdatedAt  time.Time  // 更新时间
	DeletedAt  *time.Time `sql:"index"`
}

type ExaFileUploadAndDownload struct {
	ID        int        `gorm:"primarykey"`
	Name      string     `json:"name" gorm:"comment:文件名"` // 文件名
	Url       string     `json:"url" gorm:"comment:文件地址"` // 文件地址
	Tag       string     `json:"tag" gorm:"comment:文件标签"` // 文件标签
	Key       string     `json:"key" gorm:"comment:编号"`   // 编号
	CreatedAt time.Time  // 创建时间
	UpdatedAt time.Time  // 更新时间
	DeletedAt *time.Time `sql:"index"`
}

// ExaFileChunk file chunk struct, 切片结构体
type ExaFileChunk struct {
	ID              int `gorm:"primarykey"`
	ExaFileID       uint
	FileChunkNumber int
	FileChunkPath   string
	CreatedAt       time.Time  // 创建时间
	UpdatedAt       time.Time  // 更新时间
	DeletedAt       *time.Time `sql:"index"`
}

type ExaCustomer struct {
	ID                int        `gorm:"primarykey"`
	CustomerName      string     `json:"customerName" form:"customerName" gorm:"comment:客户名"`                // 客户名
	CustomerPhoneData string     `json:"customerPhoneData" form:"customerPhoneData" gorm:"comment:客户手机号"`    // 客户手机号
	UserID            int        `json:"sysUserId" form:"sysUserId" gorm:"comment:管理ID"`                     // 管理ID
	UserAuthorityID   string     `json:"sysUserAuthorityID" form:"sysUserAuthorityID" gorm:"comment:管理角色ID"` // 管理角色ID
	CreatedAt         time.Time  // 创建时间
	UpdatedAt         time.Time  // 更新时间
	DeletedAt         *time.Time `sql:"index"`
}
